#pragma once

#include <vector>

namespace cem
{

class ElectromagneticsSystem;
struct BoundarySpec;

// Assembler 负责装配系统矩阵与向量（脚手架阶段不做实际装配）。
class Assembler
{
public:
    // 函数: assemble
    // 作用: 对给定系统执行装配（占位）。
    // 参数: system - 电磁系统引用
    // 返回: 无
    void assemble(ElectromagneticsSystem & system);

    // 函数: assemble_rhs_with_specs
    // 作用: 在不改动系统矩阵的前提下，仅根据给定的边界规格重新装配 RHS。
    //       - 会清零并重装 sys.rhs；
    //       - 会处理 Neumann 面力项；
    //       - 会按切向 Dirichlet 的 L2 投影设置对应行的 RHS 目标值；
    //       - 不会对矩阵做任何修改（不增加 Robin/Impedance 的矩阵条目，也不再次 zero_rows）。
    // 假设: 系统矩阵已由一次完整 assemble() 正确构建并 zero_rows 到位，且两套极化仅改变幅值/方向。
    // 参数: system - 电磁系统； specs - 外部传入的边界规格集合
    void assemble_rhs_with_specs(ElectromagneticsSystem & system,
                                 const std::vector<BoundarySpec> & specs);
};

} // namespace cem